home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt0187b.arc / MODULA.LST < prev    next >
File List  |  1985-07-12  |  16KB  |  844 lines

  1. MODULE filewrite;
  2.  
  3. (* Write 64 Kbyte disk file -- Logitech version *)
  4.  
  5.  
  6.  
  7. FROM FileSystem IMPORT
  8.  
  9.     File, Lookup, Close, WriteNBytes;
  10.  
  11.  
  12.  
  13. FROM SYSTEM IMPORT
  14.  
  15.     ADR;
  16.  
  17.  
  18.  
  19. CONST
  20.  
  21.     CHUNKSIZE = 128;   (* size of chunks in bytes *)
  22.  
  23.     NCHUNKS = 512;     (* number of chunks to write *)
  24.  
  25.  
  26.  
  27. TYPE
  28.  
  29.     chunkarray = ARRAY [1..CHUNKSIZE] OF CHAR;
  30.  
  31.  
  32.  
  33. VAR
  34.  
  35.         chunk : chunkarray;             (* one chunk *)
  36.  
  37.         cf : FILE;                      (* chunk file variable *)
  38.  
  39.         i : CARDINAL;                   (* loop control variable *)
  40.  
  41.         fs : FileState;                 (* status from Create/Close *)
  42.  
  43.         name : ARRAY [0..30] OF CHAR;   (* file name *)
  44.  
  45.  
  46.  
  47. BEGIN
  48.  
  49.     FOR i := 1 TO CHUNKSIZE DO
  50.  
  51.         chunk[i] := CHR(ORD('1') + (i - 1) MOD 8)
  52.  
  53.     END;
  54.  
  55.     name := "C:\TEST.DAT";
  56.  
  57.         Lookup(cf, name, TRUE);
  58.  
  59.     FOR i := 1 TO NCHUNKS DO
  60.  
  61.         WriteNBytes(cf, ADR(chunk), CHUNKSIZE)
  62.  
  63.     END;
  64.  
  65.     Close(cf)
  66.  
  67. END filewrite.
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75. MODULE fileread;
  76.  
  77. (* 64 Kbyte file read -- LOGITECH version *)
  78.  
  79.  
  80.  
  81. FROM FileSystem IMPORT
  82.  
  83.     File, Lookup, Close, ReadBytes;
  84.  
  85.  
  86.  
  87. FROM SYSTEM IMPORT
  88.  
  89.     ADR;
  90.  
  91.  
  92.  
  93. CONST
  94.  
  95.     CHUNKSIZE = 128;   (* size of chunks in bytes *)
  96.  
  97.     NCHUNKS = 512;     (* number of chunks to write *)
  98.  
  99.  
  100.  
  101. TYPE
  102.  
  103.     chunkarray = ARRAY [1..CHUNKSIZE] OF CHAR;
  104.  
  105.  
  106.  
  107. VAR
  108.  
  109.         chunk : chunkarray;                     (* one chunk *)
  110.  
  111.         cf : FILE;                                      (* chunk file variable *)
  112.  
  113.         i : CARDINAL;                           (* loop control variable *)
  114.  
  115.         junk : CARDINAL;                                (* status from ReadBytes *)
  116.  
  117.         fs : FileState;                         (* status from Open & Close *)
  118.  
  119.         name : ARRAY [0..30] OF CHAR;   (* file name *)
  120.  
  121.  
  122.  
  123. BEGIN
  124.  
  125.     name := "C:\TEST.DAT";
  126.  
  127.     Lookup(cf, name, TRUE);
  128.  
  129.     FOR i := 1 TO NCHUNKS DO
  130.  
  131.         ReadNBytes(cf, ADR(chunk), CHUNKSIZE, junk)
  132.  
  133.     END;
  134.  
  135.     Close(cf);
  136.  
  137. END fileread.
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147. MODULE calculations;
  148.  
  149. (* Modula-2 program to perform a series of real *)
  150.  
  151. (* multiplications and divisions *)
  152.  
  153.  
  154.  
  155. FROM RealInOut IMPORT
  156.  
  157.     WriteReal;
  158.  
  159.  
  160.  
  161. FROM InOut IMPORT
  162.  
  163.     WriteString, WriteLn;
  164.  
  165.  
  166.  
  167. CONST
  168.  
  169.     MAX = 5000;         (* number of iterations *)
  170.  
  171.  
  172.  
  173. VAR
  174.  
  175.     a, b, c : REAL;     (* used in calculations *)
  176.  
  177.     i : CARDINAL;       (* loop control variable *)
  178.  
  179.  
  180.  
  181. BEGIN
  182.  
  183.     a := 2.71828;
  184.  
  185.     b := 3.14159;
  186.  
  187.     c := 1.0;
  188.  
  189.     FOR i := 1 TO MAX DO
  190.  
  191.         c := c * a;
  192.  
  193.         c := c * b;
  194.  
  195.         c := c / a;
  196.  
  197.         c := c / b
  198.  
  199.     END;
  200.  
  201.     WriteString('Error = ');
  202.  
  203.     WriteReal(c - 1.0, 10);
  204.  
  205.     WriteLn
  206.  
  207. END calculations.
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215. MODULE sieve;
  216.  
  217.  
  218.  
  219. FROM InOut IMPORT
  220.  
  221.     WriteLn, WriteString, WriteCard;
  222.  
  223.  
  224.  
  225. CONST
  226.  
  227.     SIZE = 7000;
  228.  
  229.  
  230.  
  231. VAR
  232.  
  233.     flags : ARRAY [0..SIZE] OF BOOLEAN;
  234.  
  235.     i, prime, k, count, iter : CARDINAL;
  236.  
  237.  
  238.  
  239. BEGIN
  240.  
  241.     WriteString('10 iterations');
  242.  
  243.         WriteLn;
  244.  
  245.     FOR iter := 1 TO 10 DO
  246.  
  247.         count := 0;
  248.  
  249.         FOR i := 0 TO SIZE DO
  250.  
  251.             flags[i] := TRUE
  252.  
  253.         END;
  254.  
  255.         FOR i := 0 TO SIZE DO
  256.  
  257.             IF flags[i] THEN
  258.  
  259.                 prime := i + i + 3;
  260.  
  261.                 k := i + prime;
  262.  
  263.                 WHILE k <= SIZE DO
  264.  
  265.                     flags[k] := FALSE;
  266.  
  267.                     k := k + prime
  268.  
  269.                 END;
  270.  
  271.                 INC(count)
  272.  
  273.             END
  274.  
  275.         END
  276.  
  277.     END;
  278.  
  279.     WriteCard(count, 1);
  280.  
  281.     WriteString(' primes');
  282.  
  283.     WriteLn
  284.  
  285. END sieve.
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293. MODULE scout;
  294.  
  295. (* test character output to screen *)
  296.  
  297.  
  298.  
  299. FROM InOut IMPORT
  300.  
  301.         Write;
  302.  
  303.  
  304.  
  305. CONST
  306.  
  307.         MAX = 10000;    (* number of iterations *)
  308.  
  309.  
  310.  
  311. VAR
  312.  
  313.         i : CARDINAL;
  314.  
  315.  
  316.  
  317. BEGIN
  318.  
  319.         FOR i := 1 to MAX DO
  320.  
  321.                 Write('a')
  322.  
  323.         END
  324.  
  325. END scount.
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333. MODULE precision;
  334.  
  335. (* determine storage req. and precision of REAL type *)
  336.  
  337. (* find smallest number for which (1.0 + eps) > 1.0 *)
  338.  
  339.  
  340.  
  341. FROM SYSTEM IMPORT
  342.  
  343.         TSIZE;
  344.  
  345.  
  346.  
  347. FROM InOut IMPORT
  348.  
  349.         WriteString, WriteCard, WriteLn;
  350.  
  351.  
  352.  
  353. FROM RealInOut IMPORT
  354.  
  355.         WriteReal;
  356.  
  357.  
  358.  
  359. VAR
  360.  
  361.         eps : REAL;
  362.  
  363.  
  364.  
  365. BEGIN
  366.  
  367.         WriteString('Size of REAL = ');
  368.  
  369.         WriteCard(TSIZE(REAL), 1);
  370.  
  371.         WriteString(' bytes');
  372.  
  373.         WriteLn;
  374.  
  375.         
  376.  
  377.         eps := 1.0;
  378.  
  379.         REPEAT
  380.  
  381.                 WriteReal(eps, 10);
  382.  
  383.                 WriteLn;
  384.  
  385.                 eps := eps/2.0
  386.  
  387.         UNTIL 1.0 + eps = 1.0;
  388.  
  389. END precision.
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401. MODULE underflow;
  402.  
  403. (* find smallest positive REAL *)
  404.  
  405.  
  406.  
  407. FROM InOut IMPORT
  408.  
  409.         WriteLn;
  410.  
  411.  
  412.  
  413. FROM RealInOut IMPORT
  414.  
  415.         WriteReal;
  416.  
  417.  
  418.  
  419. VAR
  420.  
  421.         x : REAL;
  422.  
  423.  
  424.  
  425. BEGIN
  426.  
  427.         x := 1.0;
  428.  
  429.         REPEAT
  430.  
  431.                 WriteReal(x, 10);
  432.  
  433.                 WriteLn;
  434.  
  435.                 x := x/2.0
  436.  
  437.         UNTIL x = 0.0
  438.  
  439. END underflow.
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449. MODULE overflow;
  450.  
  451. (* find largest positive REAL *)
  452.  
  453.  
  454.  
  455. FROM InOut IMPORT
  456.  
  457.         WriteLn;
  458.  
  459.  
  460.  
  461. FROM RealInOut IMPORT
  462.  
  463.         WriteReal;
  464.  
  465.  
  466.  
  467. VAR
  468.  
  469.         x : REAL;
  470.  
  471.  
  472.  
  473. BEGIN
  474.  
  475.         x := 1.0;
  476.  
  477.         REPEAT
  478.  
  479.                 WriteReal(x, 10);
  480.  
  481.                 WriteLn;
  482.  
  483.                 x := 2.0 * x
  484.  
  485.         UNTIL FALSE
  486.  
  487. END overflow.
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501. MODULE Dhrystone;
  502.  
  503. FROM InOut IMPORT
  504.     WriteLn, WriteInt, WriteString;
  505.     
  506. FROM RealInOut IMPORT
  507.     WriteReal;
  508.     
  509. FROM Storage IMPORT
  510.     ALLOCATE, DEALLOCATE;
  511.     
  512. FROM Strings IMPORT
  513.     CompareStr;
  514.  
  515. FROM TimeDate IMPORT
  516.     GetTime, Time;
  517.     
  518. CONST
  519.     NumberOfExecutions = 10000;
  520.     NumberOfMeasurements = 10;
  521.     LargeRealNumber = 1000000.0;
  522.     MicrosecondsPerClock = 1000.0;
  523.  
  524. TYPE
  525.     Enumeration = (Ident1, Ident2, Ident3, Ident4, Ident5);
  526.     OneToThirty = [1..30];
  527.     OneToFifty = [1..50];
  528.     CapitalLetter = ['A'..'Z'];
  529.     String30 = ARRAY[0..30] OF CHAR;
  530.     Array1DimInteger = ARRAY OneToFifty OF INTEGER;
  531.     Array2DimInteger = ARRAY OneToFifty, OneToFifty OF INTEGER;
  532.     RecordPointer = POINTER TO RecordType;
  533.     RecordType = RECORD
  534.                 PointerComp : RecordPointer;
  535.                 CASE Discr : Enumeration OF
  536.                 Ident1 :
  537.                                 EnumComp : Enumeration;
  538.                                 IntComp : OneToFifty;
  539.                                 StringComp : String30;
  540.                 |
  541.                 Ident2 :
  542.                                 EnumComp2 : Enumeration;
  543.                                 StringComp2 : String30;
  544.                 |
  545.                 Ident3, Ident4, Ident5 :
  546.                                 CharComp1, CharComp2 : CHAR;
  547.                 END;
  548.         END;
  549.  
  550. VAR
  551.     ExecutionIndex : [1..NumberOfExecutions];
  552.     MeasurementIndex : [1..NumberOfMeasurements];
  553.     BeginClock, EndClock, SumClocks, EmptyLoopClocks,
  554.         TimePerExecution, SumTime, MinTime : REAL;
  555.  
  556.     PointerGlob, NextPointerGlob : RecordPointer;
  557.     IntGlob : INTEGER;
  558.     BoolGlob : BOOLEAN;
  559.     CharGlob1, CharGlob2 : CHAR;
  560.     ArrayGlob1 : Array1DimInteger;
  561.     ArrayGlob2 : Array2DimInteger;
  562.     IntGlob1, IntGlob2, IntGlob3 : OneToFifty;
  563.     CharIndex : CHAR;
  564.     EnumGlob : Enumeration;
  565.     StringGlob1, StringGlob2 : String30;
  566.  
  567. PROCEDURE Proc1(PointerParVal : RecordPointer);
  568.  
  569. BEGIN
  570.     WITH PointerParVal^.PointerComp^ DO
  571.                 PointerParVal^.PointerComp^ := PointerGlob^;
  572.                 PointerParVal^.IntComp := 5;
  573.                 IntComp := PointerParVal^.IntComp;
  574.                 PointerComp := PointerParVal^.PointerComp;
  575.                 Proc3(PointerComp);
  576.                 IF Discr = Ident1 THEN
  577.                         IntComp := 6;
  578.                 Proc6(PointerParVal^.EnumComp, EnumComp);
  579.                 PointerComp := PointerGlob^.PointerComp;
  580.                 Proc7(IntComp, 10, IntComp);
  581.                 ELSE
  582.                 PointerParVal^ := PointerParVal^.PointerComp^;
  583.                 END;
  584.     END;
  585. END Proc1;
  586.  
  587. PROCEDURE Proc2(VAR IntParRef : OneToFifty);
  588.  
  589. VAR
  590.     IntLoc : OneToFifty;
  591.     EnumLoc : Enumeration;
  592.  
  593. BEGIN
  594.     IntLoc := IntParRef + 10;
  595.     REPEAT
  596.                 IF CharGlob1 = 'A' THEN
  597.                 IntLoc := IntLoc - 1;
  598.                 IntParRef := IntLoc - CARDINAL(IntGlob);
  599.                 EnumLoc := Ident1;
  600.                 END;
  601.     UNTIL EnumLoc = Ident1;
  602. END Proc2;
  603.  
  604. PROCEDURE Proc3(VAR PointerParRef : RecordPointer);
  605.  
  606. BEGIN
  607.     IF PointerGlob <> NIL THEN
  608.                 PointerParRef := PointerGlob^.PointerComp;
  609.     ELSE
  610.                 IntGlob := 100;
  611.     END;
  612.     Proc7(10, IntGlob, PointerGlob^.IntComp);
  613. END Proc3;
  614.  
  615. PROCEDURE Proc4();
  616.  
  617. VAR
  618.     BoolLoc : BOOLEAN;
  619.     
  620. BEGIN
  621.     BoolLoc := CharGlob1 = 'A';
  622.     BoolLoc := BoolLoc OR BoolGlob;
  623.     CharGlob2 := 'B';
  624. END Proc4;
  625.  
  626. PROCEDURE Proc5();
  627.  
  628. BEGIN
  629.     CharGlob1 := 'A';
  630.     BoolGlob := FALSE;
  631. END Proc5;
  632.  
  633. PROCEDURE Proc6(EnumParVal : Enumeration; VAR EnumParRef : Enumeration);
  634.  
  635. BEGIN
  636.     EnumParRef := EnumParVal;
  637.     IF NOT Func3(EnumParVal) THEN
  638.                 EnumParRef := Ident4;
  639.     END;
  640.     CASE EnumParVal OF
  641.                 Ident1 :
  642.                 EnumParRef := Ident1;
  643.                 |
  644.                 Ident2 :
  645.                 IF IntGlob > 100 THEN
  646.                                 EnumParRef := Ident1;
  647.                 ELSE
  648.                                 EnumParRef := Ident4;
  649.                 END;
  650.                 |
  651.                 Ident3 :
  652.                         EnumParRef := Ident2;
  653.                 |
  654.                 Ident4 :
  655.                 Ident5 :
  656.                 EnumParRef := Ident3;
  657.         END;
  658. END Proc6;
  659.  
  660. PROCEDURE Proc7(IntPar1Val, IntPar2Val : OneToFifty;
  661.     VAR IntParRef : OneToFifty);
  662.  
  663. VAR
  664.     IntLoc : OneToFifty;
  665.     
  666. BEGIN
  667.     IntLoc := IntPar1Val + 2;
  668.     IntParRef := IntPar2Val + IntLoc;
  669. END Proc7;
  670.  
  671. PROCEDURE Proc8(VAR ArrayPar1Ref : Array1DimInteger;
  672.         VAR ArrayPar2Ref : Array2DimInteger;
  673.         IntPar1Val, IntPar2Val : INTEGER);
  674.  
  675. VAR
  676.     IntIndex, IntLoc : OneToFifty;
  677.  
  678. BEGIN
  679.     IntLoc := IntPar1Val + 5;
  680.     ArrayPar1Ref[IntLoc] := IntPar2Val;
  681.     ArrayPar1Ref[IntLoc + 1] := ArrayPar1Ref[IntLoc];
  682.     ArrayPar1Ref[IntLoc + 30] := IntLoc;
  683.     FOR IntIndex := IntLoc TO IntLoc + 1 DO
  684.                 ArrayPar2Ref[IntLoc, IntIndex] := IntLoc;
  685.     END;
  686.     ArrayPar2Ref[IntLoc, IntLoc - 1] := ArrayPar2Ref[IntLoc,IntLoc - 1] + 1;
  687.     ArrayPar2Ref[IntLoc + 20,IntLoc] := ArrayPar1Ref[IntLoc];
  688.     IntGlob := 5;
  689. END Proc8;
  690.  
  691. PROCEDURE Func1(CharPar1Val, CharPar2Val : CapitalLetter) : Enumeration;
  692.  
  693. VAR
  694.     CharLoc1, CharLoc2 : CapitalLetter;
  695.  
  696. BEGIN
  697.     CharLoc1 := CharPar1Val;
  698.     CharLoc2 := CharLoc1;
  699.     IF CharLoc2 <> CharPar2Val THEN
  700.                 RETURN Ident1;
  701.     ELSE
  702.                 RETURN Ident2;
  703.     END;
  704. END Func1;
  705.  
  706. PROCEDURE Func2(VAR StringPar1Ref, StringPar2Ref : String30) : BOOLEAN;
  707.  
  708. VAR
  709.     IntLoc : OneToThirty;
  710.     CharLoc : CapitalLetter;
  711.  
  712. BEGIN
  713.     IntLoc := 2;
  714.     WHILE IntLoc <= 2 DO
  715.                 IF Func1(StringPar1Ref[IntLoc], StringPar2Ref[IntLoc+1]) = Ident1 THEN
  716.                 CharLoc := 'A';
  717.                 IntLoc := IntLoc + 1;
  718.                 END;
  719.     END;
  720.     IF (CharLoc >= 'W') AND (CharLoc < 'Z') THEN
  721.                 IntLoc := 7;
  722.     END;
  723.     IF CharLoc = 'X' THEN
  724.                 RETURN TRUE;
  725.     ELSIF CompareStr(StringPar1Ref, StringPar2Ref) > 0 THEN
  726.                 IntLoc := IntLoc+7;
  727.                 RETURN TRUE;
  728.     ELSE
  729.                 RETURN FALSE;
  730.     END;
  731. END Func2;
  732.  
  733. PROCEDURE Func3(EnumParVal : Enumeration) : BOOLEAN;
  734.  
  735. VAR
  736.     EnumLoc : Enumeration;
  737.     
  738. BEGIN
  739.     EnumLoc := EnumParVal;
  740.     IF EnumLoc = Ident3 THEN
  741.                 RETURN TRUE;
  742.     END;
  743. END Func3;
  744.  
  745. PROCEDURE clock() : REAL;
  746.  
  747. VAR
  748.     Now: Time;
  749.     milliseconds: CARDINAL;
  750.     seconds: CARDINAL;
  751.     minutes: CARDINAL;
  752.     hours: CARDINAL;
  753.     
  754. BEGIN
  755.     GetTime(Now);
  756.     WITH Now DO
  757.                 seconds := millisec DIV 1000;
  758.                 milliseconds := millisec MOD 1000;
  759.                 hours := minute DIV 60;
  760.                 minutes := minute MOD 60
  761.     END;
  762.     RETURN FLOAT(milliseconds)+1000.0*(FLOAT(seconds)+60.0*(FLOAT(
  763.                 minutes)+60.0*FLOAT(hours)));
  764. END clock;
  765.  
  766. BEGIN
  767.     NEW(NextPointerGlob);
  768.     NEW(PointerGlob);
  769.     PointerGlob^.PointerComp := NextPointerGlob;
  770.     PointerGlob^.Discr := Ident1;
  771.     PointerGlob^.EnumComp := Ident3;
  772.     PointerGlob^.IntComp := 40;
  773.     PointerGlob^.StringComp := 'DHRYSTONE PROGRAM, SOME STRING';
  774.     StringGlob1 := "DHRYSTONE PROGRAM, 1'ST STRING";
  775.     WriteLn();
  776.     WriteString('Dhrystone Benchmark (March 84), Version Pascal / 2');
  777.     WriteLn();
  778.     WriteString('Times are CPU user time per execution, in microseconds');
  779.     WriteLn();
  780.     WriteLn();
  781.     SumTime := 0.0;
  782.     MinTime := LargeRealNumber;
  783.     FOR MeasurementIndex := 1 TO NumberOfMeasurements DO
  784.                 BeginClock := clock();
  785.                 Array2Glob[8][7] := 10;
  786.                 FOR ExecutionIndex := 1 TO NumberOfExecutions DO
  787.                 Proc5();
  788.                 Proc4();
  789.                         IntGlob1 := 2;
  790.                 IntGlob2 := 3;
  791.                 StringGlob2 := "DHRYSTONE PROGRAM, 2'ND STRING";
  792.                 EnumGlob := Ident2;
  793.                 BoolGlob := Func2(StringGlob1,StringGlob2);
  794.                 WHILE IntGlob1<IntGlob2 DO
  795.                                 IntGlob3 := 5 * IntGlob1 - IntGlob2;
  796.                                 Proc7(IntGlob1, IntGlob2, IntGlob3);
  797.                                 IntGlob1 := IntGlob1+1;
  798.                 END;
  799.                 Proc8(ArrayGlob1, ArrayGlob2, IntGlob1, IntGlob3);
  800.                         Proc1(PointerGlob);
  801.                 FOR CharIndex := 'A' TO CharGlob2 DO
  802.                                 IF EnumGlob = Func1(CharIndex, 'C') THEN
  803.                                          Proc6(Ident1, EnumGlob);
  804.                                 END;
  805.                 END;
  806.                 IntGlob3 := IntGlob2 * IntGlob1;
  807.                 IntGlob2 := IntGlob3 DIV IntGlob1;
  808.                 IntGlob2 := 7 * (IntGlob3 - IntGlob2) - IntGlob1;
  809.                 Proc2(IntGlob1);
  810.                 END;
  811.                 EndClock := clock();
  812.                 SumClocks := (EndClock - BeginClock) * MicrosecondsPerClock;
  813.                 BeginClock := clock();
  814.                 FOR ExecutionIndex := 1 TO NumberOfExecutions DO
  815.                 END;
  816.                 EndClock := clock();
  817.                 EmptyLoopClocks := (EndClock - BeginClock) * MicrosecondsPerClock;
  818.                 SumClocks := SumClocks - EmptyLoopClocks;
  819.                 TimePerExecution := SumClocks / FLOAT(NumberOfExecutions);
  820.                 WriteString('Time for run ');
  821.                 WriteInt(MeasurementIndex, 4);
  822.                 WriteString(': ');
  823.                 WriteReal(TimePerExecution, 10);
  824.                 WriteLn();
  825.                 SumTime := SumTime+TimePerExecution;
  826.                 IF TimePerExecution<MinTime THEN
  827.                         MinTime := TimePerExecution;
  828.                 END;
  829.     END;
  830.     WriteLn();
  831.     WriteString('Average execution time: ');
  832.     WriteReal(SumTime/FLOAT(NumberOfMeasurements), 10);
  833.     WriteLn();
  834.     WriteLn();
  835.     WriteString('Minumum execution time: ');
  836.     WriteReal(MinTime, 10);
  837.     WriteLn();
  838.     WriteLn();
  839. END Dhrystone.
  840.  
  841.  
  842.  
  843.  
  844.